#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;

class Solution {
public:
	bool isValidSudoku(vector<vector<char>>& board) {
		bool hori = isLineValid(board);
		bool verti = isVertiValid(board);
		bool cell = isCellValid(board);
		return hori && verti&&cell;
	}

	bool isLineValid(vector<vector<char>>& board) {
		bool flag = true;
		for (int i = 0; i < board.size(); i++) {
			bool valid = true;
			unordered_set<int> set;
			for (int j = 0; j < board[i].size(); j++) {
				if (set.count(board[i][j])) {
					flag = false;
					valid = false;
					break;
				}
				else if (board[i][j] != '.')
					set.insert(board[i][j]);
			}
			if (!valid) break;
		}
		return flag;
	}
	
	bool isVertiValid(vector<vector<char>>& board) {
		bool flag = true;
		for (int i = 0; i < board.size(); i++) {
			bool valid = true;
			unordered_set<int> set;
			for (int j = 0; j < board[i].size(); j++) {
				if (set.count(board[j][i])) {
					flag = false;
					valid = false;
					break;
				}
				else if (board[j][i] != '.')
					set.insert(board[j][i]);
			}
			if (!valid) break;
		}
		return flag;
	}

	bool isCellValid(vector<vector<char>>& board) {
		bool flag = true;
		for (int m = 0;m<7;m+=3) {
			for (int n = 0; n < 7; n += 3) {
				unordered_set<char> set;
				for (int i = m, count = 0; count < 3;i++, count++) {
					for (int j = n, count2 = 0; count2 < 3;j++,count2++) {
						if (set.count(board[i][j])) {
							return false;
						}
						else if (board[i][j] != '.')
							set.insert(board[i][j]);
					}
				}
			}
		}
		return flag;
	}

};

void main() {
	vector<vector<char>> board {
		{'5', '3', '.', '.', '7', '.', '.', '.', '.'},
		{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
		{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
		{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
		{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
		{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
		{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
		{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
		{'.', '.', '.', '.', '8', '.', '.', '7', '9'} };
	vector<vector<char>> board2{
		{'8', '3', '.', '.', '7', '.', '.', '.', '.'}
		,{'6', '.', '.', '1', '9', '5', '.', '.', '.'}
		,{'.', '9', '8', '.', '.', '.', '.', '6', '.'}
		,{'8', '.', '.', '.', '6', '.', '.', '.', '3'}
		,{'4', '.', '.', '8', '.', '3', '.', '.', '1'}
		,{'7', '.', '.', '.', '2', '.', '.', '.', '6'}
		,{'.', '6', '.', '.', '.', '.', '2', '8', '.'}
		,{'.', '.', '.', '4', '1', '9', '.', '.', '5'}
		,{'.', '.', '.', '.', '8', '.', '.', '7', '9'}
	};
	Solution s;
	s.isValidSudoku(board2);
}